package com.chenfan.magic.utils;


/**
 * ID生成器工具类
 *
 * @author 周夕
 */
public class IDKit {
    /**
     * 获取随机UUID
     *
     * @return 随机UUID
     */
    public static String randomUUID() {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线
     *
     * @return 简化的UUID，去掉了横线
     */
    public static String simpleUUID() {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 随机UUID
     */
    public static String fastUUID() {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 简化的UUID，去掉了横线
     */
    public static String fastSimpleUUID() {
        return UUID.fastUUID().toString(true);
    }

    /**
     * 雪花算法(分布式有序), 默认为18位Long类型, 支持传入一个参数, 指定需要获取的位数. 该值不应过小, 可用于生成验证码.
     *
     * @return
     */
    public static Long snowFlake() {
        SnowFlake snowflake = new SnowFlake(1000);
        return snowflake.nextId();
    }

    public static Long snowFlake(int num) {
        //对一个七位数取余, 也即是: 取生成的序列的后6位 => 这个数是很有可能重复的.  注: 源作中是用来生成验证码.
        Long nextId = snowFlake();
        if (num < 6 || num > 18) {
            return nextId;
        }
//        return new Double(nextId % (Math.pow(10, num))).longValue();//此方式过时或即将过时.
        return Math.round(nextId % (Math.pow(10, num)));

    }
}
